package tk.mybatis.springboot.service;

import java.util.List;

import com.github.pagehelper.PageHelper;

import org.springframework.beans.factory.annotation.Autowired;

import tk.mybatis.mapper.entity.Example;
import tk.mybatis.springboot.util.MyMapper;

/**
 * 通用Service
 * 
 * @param <T>
 */
public  class BaseService<T> implements IService<T> {

    @Autowired
    protected MyMapper<T> mapper;
   
    public MyMapper<T> getMapper() {
        return mapper;
    }
 
   
   
    @Override
    public T selectByKey(Object key) {
        //说明：根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
        return mapper.selectByPrimaryKey(key);
    }

    @Override
    public int save(T entity) {
        //说明：保存一个实体，null的属性也会保存，不会使用数据库默认值
        
        return mapper.insert(entity);
    }
    @Override
    public int saveNullByDefault(T entity) {
        //说明：保存一个实体，null的属性使用数据库默认值
        
        return mapper.insertSelective(entity);
    }


    @Override
    public int delete(Object key) {
        //说明：根据主键字段进行删除，方法参数必须包含完整的主键属性
        return mapper.deleteByPrimaryKey(key);
    }

    @Override
    public int updateByEntity(T entity) {
        //说明：根据主键更新实体全部字段，null值会被更新为null
        return mapper.updateByPrimaryKey(entity);
    }

    @Override
    public int updateNotNull(T entity) {
        //根据主键更新属性不为null的值 
        return mapper.updateByPrimaryKeySelective(entity);
    }

    @Override
    public List<T> selectByExample(Object example) {
        //说明：根据Example条件进行查询
        //重点：这个查询支持通过Example类指定查询列，通过selectProperties方法指定查询列
        return mapper.selectByExample(example);
    }

  public List<T> getAllByPage( Example  t,int pageNum ,int pageSize){
        PageHelper.startPage(pageNum, pageSize);
        
        return mapper.selectByExample(t);
  }
  public List<T> getAll( T t){
    return mapper.selectAll();
    }

    @Override //所有条件不能为空否则数据库对应字段会被设置为空
    public int updateByExamplePropsNotNull(T t,List<LogicalParam> params) {
        Example example = new   LogicalCondition<T>().LogicalParam(t, params);
        return  mapper.updateByExample(t, example);
    }
    @Override//为空属性 忽略
    public int updateByExample(T t,List<LogicalParam> params) {
        Example example = new   LogicalCondition<T>().LogicalParam(t, params);
        return  mapper.updateByExampleSelective(t, example);
    }

    @Override//
    public int deleteByExample(T t, List<LogicalParam> params) {
        Example example = new  LogicalCondition<T>().LogicalParam(t, params);
        return  mapper.deleteByExample(example);
    }

    @Override
    public int batchSave(List<T> entitys) {
        int i=0;
        for(T t:  entitys){
           i=i+ this.mapper.insert(t);
        }
        return i;
    }
  
     
}